#include <stdio.h>
#include <assert.h>

/*
6.实现memcpy    内存拷贝，只需要完成不重叠区域即可
7.实现memmove    内存拷贝，需要完成重叠区域
8. memcmp      内存比较
9. memset      设置内存的值

 */
void *my_memcpy(void *dest, const void *src, size_t num) {
    //不能传空指针，所以断言一下
    void *rest = dest;
    assert(dest && src);
    while (num--) {//字节数为循环次数，每一次循环 拷贝一个字节
        //因为指针是void * 类型， 所以再拷贝值的时候，要转换为char*，因为char 类型变量是1个字节
        *(char *) dest = *(char *) src;
        dest = (char *) dest + 1;
        src = (char *) src + 1;
    }
    return rest;
}

void *my_memmove(void *dest, const void *src, size_t num) {
    //如果dest的值 小于src，则 从前往后
    assert(dest && src);
    void *rest = dest;

    if (dest > src) {
        //从前往后交换
        while (num--) {
            *(char *) dest = *(char *) src;
            dest = (char *) dest + 1;
            src = (char *) src + 1;
        }
    } else {
        //从后往前交换
        while (num--) {
            *((char *) dest + num) = *((char *) src + num);
        }
    }
    return rest;
}

//8. memcmp    内存比较//正数是大于，负数是小于， 0 为相等
int my_memcp(const void *m1, const void *m2, size_t num) {
    assert(m1 && m2);
    while (num--) {
        if (*(char *) m1 != *(char *) m2) {
            return *(char *) m1 - *(char *) m2;
        }
        m1 = (char *) m1 + 1;
        m2 = (char *) m2 + 1;
    }
    return 0;

}

//9. memset      设置内存的值
void *my_memeset(void *m1, int value, size_t num) {
    assert(m1);
    while (num--){
        *(char*)m1 = value;//修改一个字节的值
        m1 =  (char*)m1 +1 ; //下一个字节
    }
}


//字符串打印
void PrintArr(int *arr, int len) {
    for (int i = 0; i < len; i++) {
        printf("%d ", *(arr + i));
    }
}


int main() {
    int arr1[] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};
    int arr2[20] = {1, 2, 3, 4, 5, 6};
    //实现memcpy  拷贝内存区域
    // my_memcpy(arr2,arr1,20);
    //7.实现memmove    内存拷贝，需要完成重叠区域
    // my_memmove(arr1+5, arr1, 20);
  //  int rest = my_memcp(arr1, arr2, 8);
    //PrintArr(arr1, 10);
    my_memeset(arr1,1,20);
    PrintArr(arr1, 10);
    return 0;
}